﻿using CTP.CRM.Core.Common.Attributes;
using CTP.CRM.Core.Common.Dto;
using SqlSugar;
using System.Reflection;

namespace CTP.CRM.Core.SqlSugar
{
    public static class PagedQueryableExtensions
    {
        private static string _defaultEmptyVale = CTPABPCore.Configuration["DefaultEmptyVale"];

        //
        // 摘要:
        //     sqlsugar分页集合拓展
        //
        // 参数:
        //   entity:
        //
        //   pageIndex:
        //     当前页码
        //
        //   pageSize:
        //     每页大小
        //
        //   getOriginalData:
        //     跳过空值转换逻辑
        //
        // 类型参数:
        //   TEntity:
        //     sqlsugar实体对象
        public static async Task<UnifyPageResultDto<TEntity>> ToPagedListAsync<TEntity>(this ISugarQueryable<TEntity> entity, int pageIndex, int pageSize, bool getOriginalData = false) where TEntity : class
        {
            RefAsync<int> totalCount = 0;
            List<TEntity> items = await entity.ToPageListAsync(pageIndex, pageSize, totalCount);
            if (!getOriginalData)
            {
                items = items.FillNullOrEmptyStrings();
            }

            return new UnifyPageResultDto<TEntity>(items, pageIndex, pageSize, totalCount);
        }

        //
        // 摘要:
        //     填充空字符串
        //
        // 参数:
        //   list:
        //
        //   replaceStr:
        //     空值占位字符串，优先从当前参数中获取，如果参数中没传则在配置文件中（DefaultEmptyVale）取，如果配置文件也没有则用"--"标识
        //
        // 类型参数:
        //   T:
        public static List<T> FillNullOrEmptyStrings<T>(this List<T> list, string replaceStr = "")
        {
            if (typeof(T).GetCustomAttribute<IgnoreFillNullOrEmptyStringAttribute>() == null)
            {
                string text = (string.IsNullOrEmpty(replaceStr) ? _defaultEmptyVale : replaceStr);
                foreach (T item in list)
                {
                    foreach (PropertyInfo item2 in from m in item.GetType().GetProperties()
                                                   where m.GetCustomAttribute<IgnoreFillNullOrEmptyStringAttribute>() == null
                                                   select m)
                    {
                        if (item2.PropertyType == typeof(string) && string.IsNullOrEmpty(item2.GetValue(item)?.ToString()))
                        {
                            item2.SetValue(item, string.IsNullOrEmpty(text) ? "--" : text);
                        }
                    }
                }
            }

            return list;
        }
    }
}
